Technical Q&A QA1259
Empty Memory Objects


Q: malloc(0) は何をするものですか?free(NULL) とは何ですか?

A: 一見簡単そうに見えるこの質問の答えは、特に、Mac OS の他のメモリ管理 API を対象とするようにこれらのルーチンを一般化する場合は複雑です。表 1 と 2 に、それぞれの場合に通常使用されるルーチンとその機能をまとめます。



表 1. ゼロバイトブロックの割り当て

ルーチン

プラットフォーム

戻り値

malloc

ANSI C 仕様

NULL または長さゼロのブロックへのポインタ

malloc

Mac OS X System framework

長さゼロのブロックへのポインタ
malloc CodeWarrior MSL NULL [1] [2]
CFAllocatorAllocate すべて NULL [3]
NewPtr すべて 長さゼロのブロックへのポインタ
NewHandle すべて 長さゼロのブロックのハンドル
MPAllocateAligned Mac OS X 長さゼロのブロックへのポインタ
MPAllocateAligned 従来の Mac OS NULL
OTAllocMem[InContext] すべて 長さゼロのブロックへのポインタ
operator new [] ANSI C++ 仕様 長さゼロのブロックへのポインタ
operator new [] すべて 長さゼロのブロックへのポインタ




表 2. NULL ポインタの解放

ルーチン

プラットフォーム

動作

free

ANSI C 仕様

何もしない
free すべて 何もしない [1]

CFAllocatorDeallocate

すべて

何もしない [4]
DisposePtr Mac OS X MemErrnoErr に設定する
DisposePtr 従来の Mac OS、PowerPC MemErrnoErr に設定する
DisposePtr 従来の Mac OS、68K 無効
DisposeHandle Mac OS X MemErrnilHandleErr に設定する
DisposeHandle 従来の Mac OS MemErrnoErr に設定する
MPFree Mac OS X 無効 [5]
MPFree 従来の Mac OS 何もしない
OTFreeMem すべて 何もしない
operator delete ANSI C++ 仕様 何もしない
operator delete すべて 何もしない


注記:

  1. CodeWarrior Pro 8.3 MSL から取得する MSL 情報。
  2. コンパイル時変数の _MSL_MALLOC_0_RETURNS_NON_NULL を設定し、MSL を再ビルドすることにより、この戻り値を変更できます。
  3. この動作は CFAllocatorAllocate の一部であり、使用される実際のアロケータには依存しません。
  4. この動作は CFAllocatorDeallocate の一部であり、使用される実際のアロケータには依存しません。
  5. 現在のバージョンの Mac OS X(10.2 以前)では、クラッシュはしませんが、代わりに警告メッセージをコンソールに出力します(r. 3227311)。

[2003 年 4 月 14 日]